﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AvaliacaoOnline.Model;
using AvaliacaoOnline.Data;
using System.Text.RegularExpressions;
using System.Text;

namespace Avaliacao.Controllers
{
    public class TesteController : BaseController
    {
        public ActionResult Index()
        {
            if (Session["IdUsuario"] == null || Session["ClienteUrl"].ToString() != this.Cliente)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            AvaliacaoRepository repository = new AvaliacaoRepository();
            List<AvaliacaoOnline.Data.Avaliacao> lstAvaliacoes = repository.GetAvaliacoesUsuario((int)Session["IdUsuario"]);

            ViewData["ClienteUrl"] = this.Cliente;

            AvaliacaoOnline.Data.Avaliacao avaliacaoBackground;
            if (lstAvaliacoes.Count > 0)
                avaliacaoBackground = lstAvaliacoes.First();
            else
                avaliacaoBackground = repository.GetAvaliacoes((int)Session["IdCliente"]).FirstOrDefault();

            if (avaliacaoBackground != null)
            {
                ViewData["CustomBackground"] = Url.Content("~" + UploadService.GetFileURL(@"/",
                                                                    avaliacaoBackground.ImagemFundo,
                                                                    avaliacaoBackground.IdCliente,
                                                                    avaliacaoBackground.Id));
                ViewData["CustomBackground"] = ViewData["CustomBackground"].ToString().EndsWith("/") ? "" : ViewData["CustomBackground"];

                ClienteService clienteService = new ClienteService();
                ViewData["LogotipoCliente"] = Url.Content("~" + clienteService.GetLogoImagemURL(("/"), avaliacaoBackground.IdCliente));
            }



            if (lstAvaliacoes.Count == 0)
            {
                List<AvaliacaoOnline.Data.Avaliacao> lstProximasAvaliacoes = repository.GetProximasAvaliacoesUsuario((int)Session["IdUsuario"]);

                ViewData["HoraProximaAvaliacao"] = "null";
                if (lstProximasAvaliacoes.Count > 0)
                {
                    var d = lstProximasAvaliacoes.First().DataInicial;

                    ViewData["AvaliacaoHoraInicial"] = d.ToString("HH:mm");
                    ViewData["AvaliacaoHoraInicialDiferenca"] = Convert.ToInt32(d.Subtract(DateTime.Now.NormalizeDate()).TotalMinutes).ToString();

                    var t = d.Subtract(DateTime.Now.NormalizeDate());
                    if (t.TotalHours <= 24)
                        ViewData["HoraProximaAvaliacao"] = "new Date(" + d.Year + ", " + d.Month + ", " + d.Day + ", " + t.Hours + ", " + t.Minutes + ", 0)";
                }

                var n = DateTime.Now.NormalizeDate();
                ViewData["HoraAgora"] = "new Date(" + n.Year + ", " + n.Month + ", " + n.Day + ", " + n.Hour + ", " + n.Minute + ", 0)";

                return View("SemAvaliacao");
            }
            else if (lstAvaliacoes.Count > 1)
            {
                return View("Selecao", lstAvaliacoes);
            }
            else
            {
                return Inicio(lstAvaliacoes.First().Id);
            }
        }

        public ActionResult Inicio(int id)
        {
            if (Session["IdUsuario"] == null || Session["ClienteUrl"].ToString() != this.Cliente)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            AvaliacaoRepository repository = new AvaliacaoRepository();
            var avaliacao = repository.GetAvaliacoesUsuario((int)Session["IdUsuario"]).Where(c => c.Id == id).First();

            if ((!(avaliacao.DataInicial <= DateTime.Now.NormalizeDate() && avaliacao.DataFinal >= DateTime.Now.AddHours(4))) && (avaliacao.ExibirResultado == "S"))
            {
                Response.Redirect(@"~\" + this.Cliente + @"\relatorio\desempenho\" + avaliacao.Id); return View();
            }

            ViewData["CustomCSS"] = Url.Content("~" + UploadService.GetFileURL(@"/",
                                                                avaliacao.ArquivoEstilo,
                                                                avaliacao.IdCliente,
                                                                avaliacao.Id));
            ViewData["CustomCSS"] = ViewData["CustomCSS"].ToString().EndsWith("/") ? "" : ViewData["CustomCSS"];

            ViewData["CustomBackground"] = Url.Content("~" + UploadService.GetFileURL(@"/",
                                                                avaliacao.ImagemFundo,
                                                                avaliacao.IdCliente,
                                                                avaliacao.Id));
            ViewData["CustomBackground"] = ViewData["CustomBackground"].ToString().EndsWith("/") ? "" : ViewData["CustomBackground"];

            var avalUsuario = avaliacao.AvaliacoesUsuario.Where(c => c.IdUsuario == (int)Session["IdUsuario"]).FirstOrDefault();

            ClienteService clienteService = new ClienteService();
            ViewData["LogotipoCliente"] = Url.Content("~" + clienteService.GetLogoImagemURL(("/"), avaliacao.IdCliente));

            ViewData["ClienteUrl"] = this.Cliente;

            if (avalUsuario == null || avalUsuario.Concluido != "S")
            {
                return View("Inicio", avaliacao);
            }
            else
            {
                ViewData["MensagemParticipacao"] = avaliacao.MensagemParticipacao;

                return View("AvaliacaoConcluida");
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Resposta(int idAvaliacao, int idQuestao, int step, int numeroAlternativa, int concluir)
        {
            if (Session["IdUsuario"] == null || Session["ClienteUrl"].ToString() != this.Cliente)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            ViewData["ClienteUrl"] = this.Cliente;

            AvaliacaoService avaliacaoService = new AvaliacaoService();

            bool concluida;
            avaliacaoService.ResponderQuestao(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao, idQuestao, numeroAlternativa, out concluida);
            if (concluida)
                return View("AvaliacaoConcluida");

            if (concluir > 0)
            {
                avaliacaoService.FinalizarAvaliacao(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);

                TempData["PorTempo"] = concluir == 2;

                TempData["IdAvaliacao"] = idAvaliacao;

                Response.RedirectPermanent(Url.Content("~/" + this.Cliente + "/Teste/Agradecimento"));
            }
            else
            {

                Response.RedirectPermanent(Url.Content("~/" + this.Cliente + "/Teste/Questao/" + idAvaliacao + "/" + step));
            }
            return null;
        }

        public ActionResult Questao(int idAvaliacao, int step)
        {
            if (Session["IdUsuario"] == null || Session["ClienteUrl"].ToString() != this.Cliente)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            ViewData["ClienteUrl"] = this.Cliente;

            AvaliacaoRepository repository = new AvaliacaoRepository();
            List<Questao> lstQuestoes = repository.GetQuestoes(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);
            List<Resposta> lstRespostas = repository.GetRespostas(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);

            if (lstQuestoes.Count == 0)
            {
                var n = DateTime.Now.NormalizeDate();
                ViewData["HoraAgora"] = "new Date(" + n.Year + ", " + n.Month + ", " + n.Day + ", " + n.Hour + ", " + n.Minute + ", 0)";
                return View("SemAvaliacao");
            }

            if (step == 0) step = 1;
            if (step > lstQuestoes.Count) step = lstQuestoes.Count;

            ViewData["Paginas"] = String.Format("Pagina {0} de {1}", step, lstQuestoes.Count);
            ViewData["Step"] = step;
            ViewData["StepPrev"] = (step - 1 <= 0) ? 1 : step - 1;
            ViewData["StepNext"] = (step + 1 >= lstQuestoes.Count) ? lstQuestoes.Count : step + 1;
            ViewData["IdAvaliacao"] = idAvaliacao;

            Questao questao = lstQuestoes.Skip(step - 1).Take(1).First();
            if (lstQuestoes.First().Avaliacao.AlternativaAleatoria == "S")
            {
                byte[] b = new byte[1];
                ViewData["Alternativas"] = questao.AlternativasQuestao.OrderBy(c => CryptoService.ComputeHash("AlternativaTextoHashAleatorio#$¨%&*¨sdgf" + Session["IdUsuario"].ToString() + (c.IdQuestao + 3211).ToString() + (c.NumeroAlternativa + 1000).ToString(), "MD5", b)).ToList();
            }
            else
            {
                ViewData["Alternativas"] = questao.AlternativasQuestao.OrderBy(c => c.NumeroAlternativa).ToList();
            }

            if (!String.IsNullOrEmpty(questao.ArquivoMidia1))
                ViewData["ArquivoMidia1"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL("/", questao.ArquivoMidia1, questao.Avaliacao.IdCliente, idAvaliacao, questao.Id)));
            if (!String.IsNullOrEmpty(questao.ArquivoMidia2))
                ViewData["ArquivoMidia2"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL("/", questao.ArquivoMidia2, questao.Avaliacao.IdCliente, idAvaliacao, questao.Id)));
            if (!String.IsNullOrEmpty(questao.ArquivoMidia3))
                ViewData["ArquivoMidia3"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL("/", questao.ArquivoMidia3, questao.Avaliacao.IdCliente, idAvaliacao, questao.Id)));

            ViewData["FirstStep"] = lstQuestoes.First().Numero == questao.Numero;
            ViewData["LastStep"] = lstQuestoes.Last().Numero == questao.Numero;

            ViewData["CustomCSS"] = Url.Content("~" + UploadService.GetFileURL("/",
                                                                questao.Avaliacao.ArquivoEstilo,
                                                                questao.Avaliacao.IdCliente,
                                                                questao.Avaliacao.Id));
            ViewData["CustomCSS"] = ViewData["CustomCSS"].ToString().EndsWith("/") ? "" : ViewData["CustomCSS"];

            ViewData["CustomBackground"] = Url.Content("~" + UploadService.GetFileURL("/",
                                                                questao.Avaliacao.ImagemFundo,
                                                                questao.Avaliacao.IdCliente,
                                                                questao.Avaliacao.Id));
            ViewData["CustomBackground"] = ViewData["CustomBackground"].ToString().EndsWith("/") ? "" : ViewData["CustomBackground"];

            ClienteService clienteService = new ClienteService();
            ViewData["LogotipoCliente"] = Url.Content("~" + clienteService.GetLogoImagemURL(("/"), questao.Avaliacao.IdCliente));

            ViewData["NumeroResposta"] = new AvaliacaoRepository().GetResposta(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao, questao.Id);


            //prepara paginacao
            int pagina = 1;
            StringBuilder sb = new StringBuilder();
            while (pagina <= lstQuestoes.Count)
            {
                var resposta = lstRespostas.Where(c => c.IdQuestao == lstQuestoes[pagina - 1].Id).FirstOrDefault();

                sb.AppendFormat(@"{6}<a href=""javascript:{0}({1});"" class=""questao-pagina {2} {3} {4}"">{5}</a>"
                    , resposta != null ? "paginar" : "void"
                    , resposta != null ? pagina.ToString() : "0"
                    , resposta != null ? "visited" : ""
                    , pagina == step ? "current" : ""
                    , resposta != null && resposta.NumeroAlternativa == 0 ? "semresposta" : ""
                    , pagina.ToString()
                    , (pagina % 11 == 0) ? "<br>" : ""
                    );
                pagina++;
            }
            ViewData["Paginacao"] = sb.ToString();

            //inicia a avaliacao
            AvaliacaoService avaliacaoService = new AvaliacaoService();
            if (step == 1)
            {
                avaliacaoService.IniciarAvaliacao(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);
            }

            //prepara tempo countdown
            var avaliacao = new AvaliacaoRepository().GetAvaliacao(idAvaliacao);
            ViewData["LimiteTempo"] = avaliacao.LimiteTempo == "S";
            if (avaliacao.LimiteTempo == "S")
            {
                var avalUsuario = new AvaliacaoRepository().GetAvaliacaoUsuario(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);
                int qtSegundos = avaliacao.QuantidadeSegundos - Convert.ToInt32(DateTime.Now.NormalizeDate().Subtract(avalUsuario.DataInicial.Value).TotalSeconds);
                if (qtSegundos <= 0) qtSegundos = 1;
                ViewData["TempoRestante"] = qtSegundos;
            }

            double qtdeSegundosPadrao = avaliacao.DataFinal.Subtract(avaliacao.DataInicial).TotalSeconds;
            double qtdeSegundos = qtdeSegundosPadrao;
            var avalUsuarioNovartis = repository.GetAvaliacaoUsuario(Convert.ToInt32(Session["IdUsuario"]), idAvaliacao);

            if (avalUsuarioNovartis.DataInicial.HasValue)
            {
                double aux = DateTime.Now.NormalizeDate().Subtract(avalUsuarioNovartis.DataInicial.Value).TotalSeconds;
                qtdeSegundos = qtdeSegundos - aux;
                if (qtdeSegundos <= 0) qtdeSegundos = 5;

                if (qtdeSegundos > avaliacao.DataFinal.AddMinutes(3).Subtract(DateTime.Now.NormalizeDate()).TotalSeconds)
                {
                    qtdeSegundos = avaliacao.DataFinal.AddMinutes(3).Subtract(DateTime.Now.NormalizeDate()).TotalSeconds;
                }
            }
            else
            {
                if (qtdeSegundos < qtdeSegundosPadrao)
                    qtdeSegundos += (3 * 60);
                if (qtdeSegundos > qtdeSegundosPadrao)
                    qtdeSegundos = qtdeSegundosPadrao;
            }
            ViewData["TempoRestanteNovartis"] = Convert.ToInt32(qtdeSegundos);


            return View("Questao", questao);
        }

        public ActionResult QuestaoPartial(int idCliente, int idAvaliacao, int step)
        {
            if (Session["IdUsuario"] == null)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            ViewData["ClienteUrl"] = this.Cliente;

            AvaliacaoRepository repository = new AvaliacaoRepository();
            List<Questao> lstQuestoes = repository.GetQuestoes(idAvaliacao);

            ClienteService clienteService = new ClienteService();
            ViewData["LogotipoCliente"] = Url.Content("~" + clienteService.GetLogoImagemURL((@"/"), idCliente));

            if (lstQuestoes.Count == 0)
                return PartialView("_Blank");

            if (step == 0) step = 1;
            if (step > lstQuestoes.Count) step = lstQuestoes.Count;

            ViewData["Paginas"] = String.Format("Pagina {0} de {1}", step, lstQuestoes.Count);
            ViewData["Step"] = step;
            ViewData["IdAvaliacao"] = idAvaliacao;
            ViewData["IdCliente"] = idCliente;

            Questao questao = lstQuestoes.Skip(step - 1).Take(1).First();
            ViewData["Alternativas"] = questao.AlternativasQuestao.OrderBy(c => c.NumeroAlternativa).ToList();

            if (!String.IsNullOrEmpty(questao.ArquivoMidia1))
                ViewData["ArquivoMidia1"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL(("/"), questao.ArquivoMidia1, idCliente, idAvaliacao, questao.Id)));
            if (!String.IsNullOrEmpty(questao.ArquivoMidia2))
                ViewData["ArquivoMidia2"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL(("/"), questao.ArquivoMidia2, idCliente, idAvaliacao, questao.Id)));
            if (!String.IsNullOrEmpty(questao.ArquivoMidia3))
                ViewData["ArquivoMidia3"] = UploadService.GetHTMLArquivoMidia(Url.Content("~" + UploadService.GetFileURL(("/"), questao.ArquivoMidia3, idCliente, idAvaliacao, questao.Id)));

            return PartialView("_Questao", questao);
        }

        public ActionResult Agradecimento()
        {
            if (Session["IdUsuario"] == null || Session["ClienteUrl"].ToString() != this.Cliente || TempData["IdAvaliacao"] == null)
            {
                Response.Redirect(@"~\" + this.Cliente + @"\acesso"); return View();
            }

            ViewData["ClienteUrl"] = this.Cliente;

            List<Resposta> respostas = new AvaliacaoRepository().GetRespostas(Convert.ToInt32(Session["IdUsuario"]),
                Convert.ToInt32(TempData["IdAvaliacao"]));

            int qtdeQuestoes = new AvaliacaoRepository().GetQuestoes(Convert.ToInt32(Session["IdUsuario"]),
                Convert.ToInt32(TempData["IdAvaliacao"])).Count;


            AvaliacaoOnline.Data.Avaliacao avaliacao = new AvaliacaoRepository().GetAvaliacao(Convert.ToInt32(TempData["IdAvaliacao"]));
            ClienteService clienteService = new ClienteService();
            ViewData["LogotipoCliente"] = Url.Content("~" + clienteService.GetLogoImagemURL(("/"), avaliacao.IdCliente));

            ViewData["CustomBackground"] = Url.Content("~" + UploadService.GetFileURL(@"/",
                                                                    avaliacao.ImagemFundo,
                                                                    avaliacao.IdCliente,
                                                                    avaliacao.Id));
            ViewData["CustomBackground"] = ViewData["CustomBackground"].ToString().EndsWith("/") ? "" : ViewData["CustomBackground"];

            string sMsg = avaliacao.MensagemConclusao;

            if ((bool)TempData["PorTempo"])
            {
                sMsg =
@"<p><strong><span style=""color: #800000; font-size: medium;"">O tempo da sua certifica&ccedil;&atilde;o acabou.&nbsp;</span></strong></p>
<p><span style=""font-size: medium;"">Todas</span><span style=""font-size: medium;""> as quest&otilde;es respondidas at&eacute; o momento foram salvas no sistema. <br />Em breve voc&ecirc; receber&aacute; maiores informa&ccedil;&otilde;es&nbsp;do seu Gestor sobre o Plano de Corre&ccedil;&atilde;o e as Notas&nbsp;da sua avalia&ccedil;&atilde;o.</span></p>
<p><span style=""font-size: medium;"">Qualquer d&uacute;vida entre em contato com o respons&aacute;vel pela sua linha.</span><strong></strong></p>";
            }


            ViewData["MensagemConclusao"] = String.Format(sMsg.Replace("@RespostasCorretas", "{0}").Replace("@QuantidadeQuestoes", "{1}"),
                respostas.Where(c => c.AlternativaQuestao != null && c.NumeroAlternativa == c.AlternativaQuestao.Questao.NumeroAlternativaCorreta).Count(),
                qtdeQuestoes);


            return View();
        }

        public JsonResult ValidarConclusao(int idAvaliacao)
        {
            AvaliacaoOnline.Data.Avaliacao avaliacao = new AvaliacaoRepository().GetAvaliacao(idAvaliacao);

            if (avaliacao.DataFinal.AddMinutes(3).CompareTo(DateTime.Now.NormalizeDate()) < 0)
            {
                return new JsonResult() { Data = "Encerrar" };
            }

            return new JsonResult() { Data = "" };
        }
    }
}
